package com.hmall.common.interceptors;

import cn.hutool.core.util.StrUtil;
import com.hmall.common.utils.UserContext;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 获取网关传递过来的用户信息
 * 只获取登录用户的信息
 * 这里不需要做登录拦截
 */
public class UserInfoInterceptor implements HandlerInterceptor {
    @Override // preHandle在controller之前执行；
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 保存用户信息到 ThreadLocal，方便后续业务使用；

        // 1.获取用户登录信息(网关已经放入请求头) 网关用的request响应式编程，这里是SpringMVC的。
        String userInfo = request.getHeader("user-info");
        if (StrUtil.isNotBlank(userInfo)){
            // 利用工具类，存入ThreadLocal
            UserContext.setUser(Long.valueOf(userInfo));
        }
        // 2.判断是否获取了用户，如果有，存入ThreadLocal

        // 3.放行
        return true;
    }

    @Override // afterCompletion在controller执行完之后执行；
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清理保存在ThreadLocal中的用户信息；

        UserContext.removeUser();
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
}
